#!/usr/bin/env python3
"""
grpc MCP Server

面向 grpc 软件的 MCP 服务器，提供 grpc 相关命令行操作的封装。

MCP tools 列表：
1. grpc_protoc_compile - 编译 Protocol Buffers 文件生成 C++ 代码
   - 用途：使用 protoc 编译器将 .proto 文件编译为 C++ 头文件和源文件
   - 参数：
        proto_file: str - 要编译的 .proto 文件路径
        output_dir: str - 输出目录路径
   - 返回：统一的 JSON 结构，包含命令执行结果
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
import os

mcp = FastMCP("grpc MCP Server")

@mcp.tool()
def grpc_protoc_compile(proto_file: str, output_dir: str) -> dict:
    """
    使用 protoc 编译器编译 Protocol Buffers 文件生成 C++ 代码
    
    参数:
        proto_file: 要编译的 .proto 文件路径
        output_dir: 输出目录路径，生成的 .pb.h 和 .pb.cc 文件将放在此目录
        
    返回:
        JSON 结构:
        {
            "success": bool - 命令是否成功执行,
            "command": str - 实际执行的命令,
            "exit_code": int - 命令退出码,
            "stdout": str - 标准输出内容,
            "stderr": str - 标准错误内容
        }
    """
    # 构建 protoc 命令
    command = ["protoc", "-I", os.path.dirname(proto_file) or ".", "--cpp_out", output_dir, proto_file]
    cmd_str = " ".join(command)
    
    try:
        # 执行命令
        result = subprocess.run(command, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": cmd_str,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": cmd_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command execution timed out"
        }
    except Exception as e:
        return {
            "success": False,
            "command": cmd_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Command execution failed: {str(e)}"
        }

if __name__ == "__main__":
    mcp.run()